iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0

循環神經網路(Recurrent Neural Network)

簡稱 RNN,一種深度學習網路,專門設計處理序列資料,例如:文字、音訊、時間序列

自然語言處理 理解和生成人類語言
機器翻譯 將文字從一種語言翻譯成另一種語言
語音識別 將語音轉換為文字
機器學習 從序列資料中學習並做出預測

RNN基本結構

輸入層 接收序列資料
隱藏層 RNN核心包含狀態會隨著序列資料輸入而更新
輸出層 生成RNN預測

https://ithelp.ithome.com.tw/upload/images/20240806/20163257erfHymY98E.png

圖片來源:The Architecture of a Basic RNN

https://ithelp.ithome.com.tw/upload/images/20240806/20163257ZxGgF8H72r.png

圖片來源:(https://www.researchgate.net/figure/Basic-RNN-structure_fig1_334464982)

RNN基本類型

One-to-One

  • 最基本RNN模型,輸入一個向量,輸出一個向量
  • 典型的前饋神經網絡,不涉及時間序列的處理,只處理單個靜態輸入

One-to-Many

  • 接受單個輸入,生成一系列輸出
  • 給定一張圖片,生成描述性文本,每個時間步輸出一個單詞或一個字符序列

Many-to-One

  • 接受一系列輸入,生成單個輸出
  • 情感分析,接受整段文本,生成情感分類(正面或負面情感)

Many-to-Many(同步 many-to-many)

  • 接受一系列輸入,生成一系列輸出,其中輸入和輸出的序列長度相同
  • 語音到文本轉換,接受語音信號的時序數據,並生成相應的文本序列

Many-to-Many(非同步 many-to-many)

  • 接受一系列輸入,生成一系列輸出,其中輸入和輸出序列長度可以不同
  • 機器翻譯,接受源語言的序列,生成目標語言的序列,這些序列通常在長度上是不對齊的

這些是 RNN 在不同應用場景中的基本架構類型。每種類型都有不同的應用場景和技術挑戰,根據任務需求進行選擇

https://ithelp.ithome.com.tw/upload/images/20240806/20163257JRJdkEWP9g.png

圖片來源:(https://www.cnblogs.com/wuliytTaotao/p/9512963.html)

RNN架構變體

簡單遞歸神經網路(Simple Recurrent Neural Network, SRNN)

最簡單RNN,只有一個隱藏層

長短期記憶網路(Long Short-Term Memory, LSTM)

是一種特殊RNN,專門設計處理長期依賴關係
https://ithelp.ithome.com.tw/upload/images/20240806/20163257p8vcbNQLAn.png
圖片來源:An Intuitive Explanation of LSTM

門控遞歸神經網路(Gated Recurrent Neural Network, GRU)

是一種特殊RNN,專門設計處理短期依賴關係
https://ithelp.ithome.com.tw/upload/images/20240806/20163257nUf6iWoHSs.png
圖片來源:Understanding Gated Recurrent Unit (GRU) in Deep Learning
https://ithelp.ithome.com.tw/upload/images/20240806/20163257vntuWyqBxM.png
圖片來源:(http://dprogrammer.org/rnn-lstm-gru)

RNN優缺點

優點 缺點
學習序列資料中時間依賴關係 訓練過程可能很耗時
處理大型資料集 需要大量的資料
各種序列處理任務中取得高精度 很難解釋模型的決策

RNN公式

h_t = f(W_xh_t-1 + U_x x_t + b) y_t = g(V_h h_t + b_y)

h_t 第 t 時間步隱藏狀態
x_t 第 t 時間步輸入
y_t 第 t 時間步輸出
W_h 隱藏狀態到隱藏狀態權重矩陣
U_x 輸入到隱藏狀態權重矩陣
V_h 隱藏狀態到輸出權重矩陣
b、b_y 偏置向量
f、g 非線性激活函數

工作原理

第 t 時間步,RNN將前一時間步 隱藏狀態h_t-1 和當前時間步 輸入x_t 作為輸入,通過 權重矩陣W_hU_x 進行加權求和,並加入 偏置向量b,然後,RNN 將加權求和後的結果通過 非線性激活函數f 進行處理,得到當前時間步 隱藏狀態h_t,最後,RNN 將當前時間步 隱藏狀態h_t 通過 權重矩陣V_h 進行加權求和,並加入 偏置向量b_y,通過 非線性激活函數g 進行處理,得到當前時間步 輸出y_t

雖然能夠記憶前一時間步的資訊,非常適合處理序列資料。但也會有 梯度消失梯度爆炸 問題

梯度消失

在RNN中,梯度會隨著時間步增加而逐漸消失。較早時間輸入,對時間步輸出影響較小。梯度消失問題會導致RNN難以學習長期依賴關係

梯度爆炸

在RNN中,梯度也可能會隨著時間步的增加而逐漸爆炸。對較早時間步輸入,對時間步輸出影響較大。梯度爆炸問題會導致RNN訓練不穩定

為了解決梯度消失和梯度爆炸問題,提出許多方法,例如: 長短期記憶網路(LSTM)門控循環單元(GRU)

長短期記憶網路(LSTM)

LSTM結構中包含了三個門控機制:遺忘門、輸入門和輸出門。這三個門控機制可以幫助LSTM更好地控制梯度流,從而解決梯度消失和梯度爆炸問題

門控循環單元(GRU)

GRU是一種與LSTM相似的RNN,結構中包含了兩個門控機制:重置門和更新門。GRU結構比LSTM更加簡單,但也能夠有效地解決梯度消失和梯度爆炸問題

RNN程式碼(PyTorch,對MNIST手寫數字進行序列分類)

import torch
import torch.nn as nn
import torch.optim as optim

# 超參數設定
input_size = 28
hidden_size = 100
num_classes = 10
num_layers = 2
sequence_length = 28

# 建構RNN模型
class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, num_classes, num_layers):
        super(RNN, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_size, num_classes)

    def forward(self, x):
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size)
        out, _ = self.rnn(x, h0)
        out = out[:, -1, :]
        out = self.fc(out)
        return out

# 初始化模型、損失函數和優化器
model = RNN(input_size, hidden_size, num_classes, num_layers)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters())

資料來源:循环神经网络(Recurrent Neural Network,RNN)
什麼是 RNN (遞歸神經網路)?


上一篇
Day5-CNN
下一篇
Day7-ANN
系列文
Let's Go To The AI Party!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言